package server

import (
	"context"
	"go-graduation/service/api/v1/router"
	"golang.org/x/sync/errgroup"
	"net/http"
	"os"
	"os/signal"
)

// Server http 服务。
type httpServer struct {
	srv  *http.Server
	port string
}

// HttpServer 创建一个 http 服务。
func (s *httpServer) HttpServer() *httpServer {
	handler := router.NewRouter()
	s.srv = &http.Server{
		Addr:    s.port,
		Handler: handler,
	}
	return s
}

// Start 启动 http 服务。
func (s *httpServer) Start() error {
	return s.srv.ListenAndServe()
}

// Shutdown 停止 http 服务。
func (s *httpServer) Shutdown(ctx context.Context) error {
	return s.srv.Shutdown(ctx)
}

func HttpServerStart(port string) {
	g, ctx := errgroup.WithContext(context.Background())
	s := &httpServer{}
	s.port = port
	g.Go(func() error {
		svr := s.HttpServer()
		go func() {
			<-ctx.Done()
			_ = svr.Shutdown(context.TODO())
		}()
		return svr.Start()
	})

	g.Go(func() error {
		c := make(chan os.Signal, 1)
		signal.Notify(c, os.Interrupt)
		for {
			select {
			case <-ctx.Done():
				return ctx.Err()
			case <-c:
				return nil
			}
		}
	})

	// 等待 group 中所有函数结束，如果出现错误，则返回第一个错误
	_ = g.Wait()
}
